public class math{
        /**
     *Bildet das Skalarprodukt
     * */
    public long skalarprodukt(long[] l, long[] l0){
        if(l.length != l0.length){//Abfangen falscher Eingaben.
            System.err.println("Die Anzahl der Komponenten der Einzelen Verktoren ist nicht gleich 3!!!");
            return 0;// hier muss ein besser wert hin (null oder was ähnliches)
        }
        long ausgabe =0;
        
        for(int i=0;i<3;i++)
            ausgabe+=(l[i]*l0[i]);
        return ausgabe;
    }
    
    /**
     *Bildet das Kreuzprodukt aus den Vektoren l un l0
     *Es muessen beide aus drei Komponenten bestehen
     *wir die Methode abgebrochen.
     */
    public long[] kreuzprodukt(long[] l, long[] l0){
        if(l.length != l0.length || l.length!=3){//Abfangen falscher Eingaben.
            System.err.println("Die Anzahl der Komponenten der Einzelen Verktoren ist nicht gleich 3!!!");
            return null;
        }
        long[] ausgabe=new long[3];
        
        ausgabe[0]=l[1]*l0[2]-l[2]*l0[1];
        ausgabe[1]=l[2]*l0[0]-l[2]*l0[0];
        ausgabe[2]=l[0]*l0[1]-l[1]*l0[0];
        
        return ausgabe;
    }
    
    /**
     * Bestimmt den Richtungsvektor, nach dem aprallen von der Wand, aus dem altem richtungsvektor (l)
     * und den richtungsvektoren der Ebene (l0 und l1)
     * Funktioniert nur mit Vektoren mit drei Komponenten
     */
    public long[] richtungsAebderung(long[] l, long[] l0, long[] l1){
        if(l.length!=3|| l0.length!=3|| l1.length!=3){//Abfangen falscher Eingaben.
            System.err.println("Die Anzahl der Komponenten der Einzelen Verktoren ist nicht gleich 3!!!");
            return null;
        }
        if(0 == skalarprodukt(l,l0)&&0 == skalarprodukt(l,l1)){
            for(int i =0;i<3;i++)
                l[i]=-l[i];
            return l;        
        }
        l0=kreuzprodukt(l0,l1);//Bildung der Normalen der Ebene
        for(int i=0;i<3;i++)//Bestimmung des Lotfusspunktes
            l1[i]=(l[0]*l0[0]+l[1]*l0[1]+l[2]*l0[2])/(l0[0]*l0[0]+l0[1]*l0[1]+l0[2]*l0[2])*l0[i];
        for(int i=0;i<3;i++)//Bildung des Lotvektors vom Punkt auf die Normale
            l0[i]=l1[i]-l[i];
        for(int i=0;i<3;i++)//Bildet den spiegel Vektor zu l
            l1[i]=l1[i]+l0[i];
        for(int i=0;i<3;i++)//Bildet durch Spiegelung den Austrittsvektor ( negativer spiegelvekor zu l)
            l1[i]=-l[i];
        
        return l1;
    }
}